package capitulo2;

/***********************************************
 * Tipos de retorno validos (Objetivo 1.5)
 * *********************************************
 * 
 * Para el examen, asegurate de saber que los metodos sobrecargados pueden
 * regresar el tipo, pero los metodos sobrescritos pueden hacer solo lo que la
 * covariante devuelva. Simplemente, esto es lo unico que te ayudara en la
 * pregunta del examen.
 **/

class Alpha {
	Alpha go(char c) {
		return new Alpha();
	}
}

class Beta extends Alpha {
	Beta go(char c) {
		return new Beta(); // Sobreescritura legal en Java 5.
	}
}

public class Tema14_TiposReturn {

	/**
	 * Devolviendo un valor
	 **/

	// 1. Puedes devolver null en un metodo con un objeto de referencia de tipo
	// return:
	public Alpha doStuff() {
		return null;
	}

	// 2. Un array es un tipo de retorno legal.
	public String[] go() {
		return new String[] { "Fred", "Barney", "Wilma" };
	}

	// 3.En el metodo con un tipo de retorno primitivo, puedes devolver
	// cualquier valor o variable que pueda ser convertida implicitamente al
	// tipo declarado:
	public int getFoo() {
		char c = 'c';
		return c;
	}

	// 4. No puedes devolver nada de un metodo de tipo void:

	public void bar() {
		// return "this is it"; // Not legal!!
	}

	// 5. En un metodo con un tipo objeto de referencia, puedes devolver
	// cualquier tipo de objeto que pueda ser implicitamente casteado al tipo de
	// retorno declarado.

	public Alpha getAlpha(){
		return new Beta(); 	// Se asume que Beta extends Alpha 
	}
	
	public Object getObject(){
		int[] nums = {1,2,3};
		return nums; 		// Devuelve un array int, que es todavia un objeto
	}
	
	public interface Chewable { }
	 
	public class Gum implements Chewable { }
	 
	public class TestChewable {
	    // Metodo con un tipo de retorno interfaz
	    public Chewable getChewable() {
	    return new Gum(); // Devuelve el implementador de la interfaz
	    }
	}
	
}
